import { createUpdateDataFunction, getTargetAndPath } from "./utils.mjs";
import { render_array_cell } from "./renderers.mjs";

/**
 * 数组相关的辅助函数模块
 * 提供数组项的创建、初始化等功能
 */

/**
 * 创建数组项元素
 * 包括渲染单元格、添加删除按钮等
 *
 * @param {Object} params 参数对象
 * @param {HTMLElement} params.container 容器元素
 * @param {Object} params.schema Schema 定义
 * @param {string} params.mode 显示模式
 * @param {HTMLElement} params.body 表体容器
 * @param {number|null} [params.index] 数组索引
 * @param {*} [params.data] 项目数据
 * @returns {HTMLElement} 创建的数组项元素
 */
export function createArrayItem({
  container,
  schema,
  mode,
  body,
  index = null,
  data = null,
}) {
  const itemWrapper = document.createElement("json_array_item");
  const itemIndex = index ?? body.children.length;
  itemWrapper.path = `${schema.path}[${itemIndex}]`;

  // 渲染单元格
  if (schema.items?.properties) {
    // 对象类型数组，渲染每个属性的单元格
    Object.entries(schema.items.properties).forEach(([key, prop]) => {
      const updateData = createUpdateDataFunction(
        container,
        `${itemWrapper.path}.${key}`
      );

      render_array_cell({
        container: itemWrapper,
        schema: {
          ...prop,
          name: key,
          path: `${itemWrapper.path}.${key}`,
        },
        data: data?.[key],
        updateData,
        mode,
      });
    });
  } else {
    // 简单类型数组，渲染单个值的单元格
    const updateData = createUpdateDataFunction(container, itemWrapper.path);

    render_array_cell({
      container: itemWrapper,
      schema: {
        ...schema.items,
        path: itemWrapper.path,
      },
      data,
      updateData,
      mode,
    });
  }

  // 只在编辑模式下添加删除按钮单元格
  if (mode === "edit") {
    const deleteCell = document.createElement("json_property");
    deleteCell.className = "delete-column";
    const deleteBtn = document.createElement("button");
    deleteBtn.textContent = "×";
    deleteBtn.className = "delete-item";
    deleteBtn.onclick = () => {
      itemWrapper.remove();
      const result = getTargetAndPath(container, schema.path);
      if (result && Array.isArray(result.target[result.finalKey])) {
        result.target[result.finalKey].splice(itemIndex, 1);
      }
    };
    deleteCell.appendChild(deleteBtn);
    itemWrapper.appendChild(deleteCell);
  }

  return itemWrapper;
}

/**
 * 根据类型创建默认值
 *
 * @param {string} type Schema 类型
 * @returns {*} 对应类型的默认值
 */
export function createDefaultValue(type) {
  switch (type) {
    case "number":
    case "integer":
      return 0;
    case "boolean":
      return false;
    case "string":
      return "";
    case "object":
      return {};
    case "array":
      return [];
    default:
      return null;
  }
}

/**
 * 初始化新的数组项
 * 根据 schema 定义创建包含默认值的对象
 *
 * @param {Object} schema Schema 定义
 * @returns {Object} 初始化的对象
 */
export function initializeNewItem(schema) {
  const newItem = {};
  if (schema.items?.properties) {
    Object.entries(schema.items.properties).forEach(([key, prop]) => {
      newItem[key] = createDefaultValue(prop.type);
    });
  }
  return newItem;
}
